home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / SDL / examples / testbitmap.c < prev    next >
C/C++ Source or Header  |  2002-10-27  |  3KB  |  149 lines

  1.  
  2. /* Simple program:  Test bitmap blits */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #include "SDL.h"
  9. #include "picture.xbm"
  10. #include <inline/SDL.h>
  11.  
  12. SDL_Surface *LoadXBM(SDL_Surface *screen, int w, int h, Uint8 *bits)
  13. {
  14.     SDL_Surface *bitmap;
  15.     Uint8 *line;
  16.  
  17.     /* Allocate the bitmap */
  18.     bitmap = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 1, 0, 0, 0, 0);
  19.     if ( bitmap == NULL ) {
  20.         fprintf(stderr, "Couldn't allocate bitmap: %s\n",
  21.                         SDL_GetError());
  22.         return(NULL);
  23.     }
  24.  
  25.     /* Copy the pixels */
  26.     line = (Uint8 *)bitmap->pixels;
  27.     w = (w+7)/8;
  28.     while ( h-- ) {
  29.         memcpy(line, bits, w);
  30.         /* X11 Bitmap images have the bits reversed */
  31.         { int i, j; Uint8 *buf, byte;
  32.             for ( buf=line, i=0; i<w; ++i, ++buf ) {
  33.                 byte = *buf;
  34.                 *buf = 0;
  35.                 for ( j=7; j>=0; --j ) {
  36.                     *buf |= (byte&0x01)<<j;
  37.                     byte >>= 1;
  38.                 }
  39.             }
  40.         }
  41.         line += bitmap->pitch;
  42.         bits += w;
  43.     }
  44.     return(bitmap);
  45. }
  46.  
  47. int main(int argc, char *argv[])
  48. {
  49.     SDL_Surface *screen;
  50.     SDL_Surface *bitmap;
  51.     Uint8  video_bpp;
  52.     Uint32 videoflags;
  53.     Uint8 *buffer;
  54.     int i, done;
  55.     SDL_Event event;
  56.     
  57.     /* Initialize SDL */
  58.     if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
  59.         fprintf(stderr, "Couldn't initialize SDL: %s\n",SDL_GetError());
  60.         exit(1);
  61.     }
  62.     atexit(SDL_Quit);
  63.  
  64.     video_bpp = 0;
  65.     videoflags = SDL_SWSURFACE;
  66.     while ( argc > 1 ) {
  67.         --argc;
  68.         if ( strcmp(argv[argc-1], "-bpp") == 0 ) {
  69.             video_bpp = atoi(argv[argc]);
  70.             --argc;
  71.         } else
  72.         if ( strcmp(argv[argc], "-warp") == 0 ) {
  73.             videoflags |= SDL_HWPALETTE;
  74.         } else
  75.         if ( strcmp(argv[argc], "-hw") == 0 ) {
  76.             videoflags |= SDL_HWSURFACE;
  77.         } else
  78.         if ( strcmp(argv[argc], "-fullscreen") == 0 ) {
  79.             videoflags |= SDL_FULLSCREEN;
  80.         } else {
  81.             fprintf(stderr,
  82.             "Usage: %s [-bpp N] [-warp] [-hw] [-fullscreen]\n",
  83.                                 argv[0]);
  84.             exit(1);
  85.         }
  86.     }
  87.  
  88.     /* Set 640x480 video mode */
  89.     if ( (screen=SDL_SetVideoMode(640,480,video_bpp,videoflags)) == NULL ) {
  90.         fprintf(stderr, "Couldn't set 640x480x%d video mode: %s\n",
  91.                         video_bpp, SDL_GetError());
  92.         exit(2);
  93.     }
  94.  
  95.     /* Set the surface pixels and refresh! */
  96.     if ( SDL_LockSurface(screen) < 0 ) {
  97.         fprintf(stderr, "Couldn't lock the display surface: %s\n",
  98.                             SDL_GetError());
  99.         exit(2);
  100.     }
  101.     buffer=(Uint8 *)screen->pixels;
  102.     for ( i=0; i<screen->h; ++i ) {
  103.         memset(buffer,(i*255)/screen->h, screen->pitch);
  104.         buffer += screen->pitch;
  105.     }
  106.     SDL_UnlockSurface(screen);
  107.     SDL_UpdateRect(screen, 0, 0, 0, 0);
  108.  
  109.     /* Load the bitmap */
  110.     bitmap = LoadXBM(screen, picture_width, picture_height,
  111.                     (Uint8 *)picture_bits);
  112.     if ( bitmap == NULL ) {
  113.         exit(1);
  114.     }
  115.  
  116.     /* Wait for a keystroke */
  117.     done = 0;
  118.     while ( !done ) {
  119.         /* Check for events */
  120.         while ( SDL_PollEvent(&event) ) {
  121.             switch (event.type) {
  122.                 case SDL_MOUSEBUTTONDOWN: {
  123.                     SDL_Rect dst;
  124.  
  125.                     dst.x = event.button.x - bitmap->w/2;
  126.                     dst.y = event.button.y - bitmap->h/2;
  127.                     dst.w = bitmap->w;
  128.                     dst.h = bitmap->h;
  129.                     SDL_BlitSurface(bitmap, NULL,
  130.                                 screen, &dst);
  131.                     SDL_UpdateRects(screen,1,&dst);
  132.                     }
  133.                     break;
  134.                 case SDL_KEYDOWN:
  135.                     /* Any key press quits the app... */
  136.                     done = 1;
  137.                     break;
  138.                 case SDL_QUIT:
  139.                     done = 1;
  140.                     break;
  141.                 default:
  142.                     break;
  143.             }
  144.         }
  145.     }
  146.     SDL_FreeSurface(bitmap);
  147.     return(0);
  148. }
  149.